home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / gui / uberwidgets / UberButton.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  22KB  |  693 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import wx
  5. from wx import Size, VERTICAL, HORIZONTAL, BufferedPaintDC, Color, Rect, RectS
  6. LEFT_VCENTER = wx.ALIGN_LEFT | wx.ALIGN_CENTRE_VERTICAL
  7. from gui.textutil import GetTextExtent, DeAmp, TruncateText
  8. import UberEvents
  9. from gui import skin
  10. from gui.windowfx import ApplySmokeAndMirrors
  11. from util import do
  12. from gui.skin.skinobjects import SkinGradient, Margins
  13. from common import prefprop
  14. from gui.textutil import default_font
  15. from gui.uberwidgets import UberWidget
  16. NATIVE_BACKGROUNDS = [
  17.     4,
  18.     1,
  19.     3,
  20.     2,
  21.     3,
  22.     3,
  23.     2]
  24. from gui.uberwidgets.keycatcher import KeyCatcher
  25.  
  26. class UberButton(UberWidget, wx.PyControl):
  27.     
  28.     def __init__(self, parent, id = -1, label = '', skin = None, icon = None, pos = wx.DefaultPosition, size = None, style = HORIZONTAL, type = None, menu = None, menubarmode = False, onclick = None):
  29.         wx.PyControl.__init__(self, parent, id = id, style = wx.NO_BORDER | wx.FULL_REPAINT_ON_RESIZE)
  30.         if type == 'combo':
  31.             UberWidget.__init__(self, 'COMBOBOX')
  32.         else:
  33.             UberWidget.__init__(self, 'button')
  34.         self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
  35.         self.label = label
  36.         if label:
  37.             self.RegAccel(label)
  38.         
  39.         self.notified = False
  40.         self.active = False
  41.         self.isdown = False
  42.         self.hovered = False
  43.         self.state = 1
  44.         self.menu = None if type == 'menu' else None
  45.         if menu is not None and hasattr(menu, 'OnDismiss'):
  46.             (menu, menu.OnDismiss) += (lambda : self.AddPendingEvent(wx.MenuEvent(wx.wxEVT_MENU_CLOSE, menu.Id)))
  47.         
  48.         if icon:
  49.             self.icon = icon
  50.             self.MakeDicon()
  51.         else:
  52.             self.icon = None
  53.         self.style = style
  54.         self.type = type
  55.         self.menubarmode = menubarmode
  56.         self.ssize = wx.Size(0, 0)
  57.         self.staticwidth = None
  58.         if size:
  59.             self.autoscale = False
  60.         else:
  61.             self.autoscale = True
  62.         self.native = None
  63.         self.Sizer = wx.BoxSizer(HORIZONTAL)
  64.         self.SetSkinKey(skin, True)
  65.         Bind = self.Bind
  66.         (Bind((wx.EVT_MOVE,), (lambda e: self.Refresh())),)
  67.         (Bind(wx.EVT_PAINT, self.OnPaint),)
  68.         (Bind((wx.EVT_SET_FOCUS,), (lambda e: self.Refresh())),)
  69.         (Bind(wx.EVT_KEY_DOWN, self.OnKeyDown),)
  70.         (Bind(wx.EVT_KEY_UP, self.OnKeyUp),)
  71.         (Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus),)
  72.         (Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown),)
  73.         (Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDown),)
  74.         (Bind(wx.EVT_LEFT_UP, self.OnLeftUp),)
  75.         (Bind(wx.EVT_ENTER_WINDOW, self.OnMouseIn),)
  76.         (Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseOut),)
  77.         (Bind(wx.EVT_MOTION, self.OnMotion),)
  78.         Bind((wx.EVT_MENU_CLOSE,), (lambda e: (self.Active(False), self.OnMouseOut())))
  79.         Bind(wx.EVT_SHOW, self.OnShow)
  80.         if onclick is not None:
  81.             if not hasattr(onclick, '__call__'):
  82.                 raise TypeError('onclick must be callable')
  83.             
  84.             self.Bind((wx.EVT_BUTTON,), (lambda e: (e.Skip(), onclick())))
  85.         
  86.  
  87.     
  88.     def __repr__(self):
  89.         
  90.         try:
  91.             return "<UberButton '%s'>" % self.label
  92.         except:
  93.             return '<UberButton %s>' % id(self)
  94.  
  95.  
  96.     
  97.     def SetAlignment(self, alignment):
  98.         self.style = alignment
  99.         self.Calcumalate()
  100.  
  101.     
  102.     def GetAlignment(self):
  103.         return self.style
  104.  
  105.     Alignment = property(GetAlignment, SetAlignment)
  106.     
  107.     def SetStaticWidth(self, width = None):
  108.         self.staticwidth = width
  109.         self.Calcumalate()
  110.  
  111.     
  112.     def OnMotion(self, event):
  113.         if self.native:
  114.             event.Skip()
  115.             return None
  116.         
  117.         r = RectS(self.Size)
  118.         if self.HasCapture() and not event.LeftIsDown() and not r.Contains(event.Position):
  119.             while self.HasCapture():
  120.                 self.ReleaseMouse()
  121.         
  122.  
  123.     
  124.     def KeyCatcher(self):
  125.         
  126.         try:
  127.             return self.Top._keycatcher
  128.         except AttributeError:
  129.             k = self.Top._keycatcher = KeyCatcher(self.Top)
  130.             return k
  131.  
  132.  
  133.     KeyCatcher = property(KeyCatcher)
  134.     
  135.     def UpdateSkin(self):
  136.         key = self.skinkey
  137.         native = not key
  138.         if native and self.uxthemeable:
  139.             self.rendernative = True
  140.             self.destroy_native()
  141.             self.OpenNativeTheme()
  142.             skinget = skin.get
  143.             self.menuicon = skinget('appdefaults.dropdownicon')
  144.             self.padding = (5, 5)
  145.             self.margins = Margins([
  146.                 0,
  147.                 0,
  148.                 0,
  149.                 0])
  150.             self.Font = default_font()
  151.             self.fontcolors = [
  152.                 wx.BLACK] * 7
  153.             self.backgrounds = NATIVE_BACKGROUNDS
  154.             self.Cut()
  155.         elif native:
  156.             if not self.native:
  157.                 self.native = wx.Button(self, style = wx.BU_EXACTFIT)
  158.                 self.native.SetLabel(self.label)
  159.                 self.Sizer.Add(self.native, 1, wx.EXPAND)
  160.                 self.Layout()
  161.                 self.Cut()
  162.             
  163.         else:
  164.             self.rendernative = False
  165.             self.destroy_native()
  166.             skinget = skin.get
  167.             skinroot = skin.get(key)
  168.             s = skinroot.get
  169.             self.menuicon = s('menuicon', skinget('appdefaults.dropdownicon'))
  170.             self.padding = s('padding', (5, 5))
  171.             self.margins = s('margins', Margins([
  172.                 0,
  173.                 0,
  174.                 0,
  175.                 0]))
  176.             self.Font = s('font', default_font())
  177.             fc = skinroot.get('fontcolors', { })
  178.             s = fc.get
  179.             self.fontcolors = [
  180.                 s('disabled', Color(125, 125, 125)),
  181.                 s('normal', wx.BLACK),
  182.                 s('active', wx.BLACK),
  183.                 s('hover', wx.BLACK),
  184.                 s('activehover', wx.BLACK),
  185.                 s('down', wx.BLACK),
  186.                 s('notify', wx.WHITE)]
  187.             bgs = skinroot.get('backgrounds', { })
  188.             
  189.             def s(key, default):
  190.                 
  191.                 try:
  192.                     return bgs[key]
  193.                 except:
  194.                     return default()
  195.  
  196.  
  197.             disabled = s('disabled', (lambda : SkinGradient('vertical', [
  198. Color(125, 125, 125),
  199. Color(237, 237, 237)])))
  200.             normal = s('normal', (lambda : SkinGradient('vertical', [
  201. Color(200, 255, 200),
  202. Color(85, 255, 85)])))
  203.             active = s('active', (lambda : SkinGradient('vertical', [
  204. Color(200, 255, 238),
  205. Color(85, 255, 238)])))
  206.             hover = s(('hover',), (lambda : normal))
  207.             activehover = s(('activehover',), (lambda : active))
  208.             down = s('down', (lambda : SkinGradient('vertical', [
  209. Color(0, 125, 0),
  210. Color(0, 204, 0)])))
  211.             notify = s('notify', (lambda : SkinGradient('vertical', [
  212. Color(255, 255, 200),
  213. Color(255, 255, 85)])))
  214.             self.backgrounds = [
  215.                 disabled,
  216.                 normal,
  217.                 active,
  218.                 hover,
  219.                 activehover,
  220.                 down,
  221.                 notify]
  222.         self.Calcumalate()
  223.         self.Refresh()
  224.  
  225.     
  226.     def destroy_native(self):
  227.         if self.native:
  228.             self.native.Show(False)
  229.             self.Sizer.Detach(self.native)
  230.             self.native.Destroy()
  231.             self.native = None
  232.         
  233.  
  234.     
  235.     def Enable(self, switch = True):
  236.         if not self.native:
  237.             wx.PyControl.Enable(self, switch)
  238.             if switch:
  239.                 events = [
  240.                     (wx.EVT_LEFT_DOWN, self.OnLeftDown),
  241.                     (wx.EVT_LEFT_DCLICK, self.OnLeftDown),
  242.                     (wx.EVT_LEFT_UP, self.OnLeftUp),
  243.                     (wx.EVT_ENTER_WINDOW, self.OnMouseIn),
  244.                     (wx.EVT_LEAVE_WINDOW, self.OnMouseOut)]
  245.                 (do,)((lambda .0: for event, method in .0:
  246. self.Bind(event, method))(events))
  247.             else:
  248.                 events = [
  249.                     wx.EVT_LEFT_DOWN,
  250.                     wx.EVT_LEFT_DCLICK,
  251.                     wx.EVT_LEFT_UP,
  252.                     wx.EVT_ENTER_WINDOW,
  253.                     wx.EVT_LEAVE_WINDOW]
  254.                 (do,)((lambda .0: for event in .0:
  255. self.Unbind(event))(events))
  256.             self.state = None if switch else 0
  257.             if self.ScreenRect.Contains(wx.GetMousePosition()):
  258.                 self.GetHover()
  259.             else:
  260.                 self.ReleaseHover()
  261.         else:
  262.             self.native.Enable(switch)
  263.         self.Refresh()
  264.  
  265.     
  266.     def SetMenuBarMode(self, switch = None):
  267.         if switch:
  268.             self.menubarmode = switch
  269.         else:
  270.             self.menubarmode = not (self.menubarmode)
  271.  
  272.     
  273.     def MakeDicon(self):
  274.         self.dicon = self.icon.Greyed.WXB
  275.  
  276.     
  277.     def SetIcon(self, icon = None):
  278.         if icon:
  279.             self.icon = icon
  280.             self.MakeDicon()
  281.         else:
  282.             self.icon = None
  283.             self.dicon = None
  284.         self.Calcumalate()
  285.         self.Refresh()
  286.  
  287.     
  288.     def SetNotify(self, switch):
  289.         self.notified = switch
  290.         self.Refresh()
  291.  
  292.     
  293.     def RegAccel(self, label = ''):
  294.         i = label.find('&')
  295.         if i != -1 and i < len(label) - 1 and label[i + 1] != '&':
  296.             self.KeyCatcher.OnDown('alt+%s' % label[i + 1], self.FakeClick)
  297.         
  298.  
  299.     
  300.     def SetLabel(self, label = ''):
  301.         self.RegAccel(label)
  302.         self.label = label
  303.         if self.native:
  304.             self.native.SetLabel(label)
  305.         
  306.         self.Calcumalate()
  307.         self.Refresh()
  308.  
  309.     
  310.     def GetLabel(self):
  311.         return self.label
  312.  
  313.     Label = property(GetLabel, SetLabel)
  314.     
  315.     def FakeClick(self, event = None):
  316.         if self.type == 'toggle':
  317.             self.Active()
  318.             self.SendButtonEvent(wx.wxEVT_COMMAND_TOGGLEBUTTON_CLICKED)
  319.         
  320.         if self.type == 'menu' and not (self.active):
  321.             self.CallMenu()
  322.         elif not self.type == 'menu':
  323.             self.SendButtonEvent()
  324.         
  325.  
  326.     
  327.     def Calcumalate(self):
  328.         if self.native:
  329.             self.Size = self.MinSize = self.native.BestSize
  330.             self.Parent.Layout()
  331.             ApplySmokeAndMirrors(self)
  332.             return None
  333.         
  334.         label = DeAmp(self.label)
  335.         if self.icon:
  336.             iconwidth = self.icon.Width
  337.             iconheight = self.icon.Height
  338.         else:
  339.             (iconwidth, iconheight) = (0, 0)
  340.         if label != '':
  341.             labelwidth = GetTextExtent(label, self.Font)[0]
  342.             labelheight = self.Font.Height
  343.         else:
  344.             (labelwidth, labelheight) = (0, 0)
  345.         self.labelsize = Size(labelwidth, labelheight)
  346.         margins = self.margins
  347.         (sx, sy) = self.padding
  348.         swidth = 0
  349.         sheight = 0
  350.         if self.icon and label != '':
  351.             if self.style == HORIZONTAL:
  352.                 swidth += iconwidth + labelwidth + 3 * sx
  353.                 if iconheight > labelheight:
  354.                     sheight += iconheight + 2 * sy
  355.                     iy = sy
  356.                 else:
  357.                     sheight += labelheight + 2 * sy
  358.                     iy = sy + labelheight // 2 - iconheight // 2
  359.                 self.iconcurser = wx.Point(sx, iy)
  360.                 self.labelcurser = wx.Point(self.iconcurser.x + iconwidth + sx, self.iconcurser.y + iconheight / 2 - labelheight / 2)
  361.                 if self.menu and not (self.menubarmode) and self.menuicon:
  362.                     swidth += self.menuicon.Width + sx
  363.                 
  364.                 self.ssize = Size(margins.left + swidth + margins.right, margins.top + sheight + margins.bottom)
  365.             elif self.style == VERTICAL:
  366.                 labelwin = labelwidth > iconwidth
  367.                 if labelwin:
  368.                     swidth += labelwidth + 2 * sx
  369.                 else:
  370.                     swidth += iconwidth + 2 * sx
  371.                 sheight += iconheight + labelheight + 3 * sy
  372.                 lx = sx
  373.                 if labelwin:
  374.                     self.iconcurser = wx.Point(lx + labelwidth / 2 - iconwidth / 2, sy)
  375.                     self.labelcurser = wx.Point(lx, self.iconcurser.y + iconheight + sy)
  376.                 else:
  377.                     self.iconcurser = wx.Point(lx, sy)
  378.                     self.labelcurser = wx.Point(lx + iconwidth / 2 - labelwidth / 2, self.iconcurser.y + iconheight + sy)
  379.                 if self.menu and not (self.menubarmode):
  380.                     swidth += self.menuicon.Width + sx
  381.                 
  382.                 self.ssize = Size(margins.left + swidth + margins.right, margins.top + sheight + margins.bottom)
  383.             
  384.         elif self.icon:
  385.             swidth += iconwidth + 2 * sx
  386.             sheight += iconheight + 2 * sy
  387.             self.iconcurser = wx.Point(sx, sy)
  388.             if self.menu and not (self.menubarmode):
  389.                 swidth += self.menuicon.Width + sx
  390.             
  391.             self.ssize = Size(margins.left + swidth + margins.right, margins.top + sheight + margins.bottom)
  392.         elif label != '':
  393.             swidth += labelwidth + 2 * sx
  394.             sheight += labelheight + 2 * sy
  395.             self.labelcurser = wx.Point(sx, sy)
  396.             if self.menu and not (self.menubarmode):
  397.                 swidth += self.menuicon.Width + sx
  398.             
  399.             self.ssize = Size(margins.left + swidth + margins.right, margins.top + sheight + margins.bottom)
  400.         elif self.menu is not None and not (self.menubarmode):
  401.             swidth += self.menuicon.Width
  402.             sheight += self.menuicon.Height
  403.             self.ssize = Size(swidth + 2 * sx + margins.x, sheight + 2 * sy + margins.y)
  404.         else:
  405.             self.ssize = Size(16, 16)
  406.         if self.staticwidth:
  407.             self.ssize.width = self.staticwidth
  408.         
  409.         self.MinSize = self.ssize
  410.         self.InvalidateBestSize()
  411.         self.Parent.Layout()
  412.  
  413.     
  414.     def DoGetBestSize(self):
  415.         self.CacheBestSize(self.ssize)
  416.         return self.ssize
  417.  
  418.     side_tabs = prefprop('tabs.side_tabs', False)
  419.     
  420.     def OnPaint(self, event):
  421.         if self.native:
  422.             event.Skip()
  423.             return None
  424.         
  425.         rect = RectS(self.Size)
  426.         parent = self.Parent
  427.         grandparent = self.GrandParent
  428.         if parent.__class__.__name__ == 'Tab' and self.side_tabs:
  429.             cliptangle = RectS(self.Size)
  430.             sy = self.Rect.y
  431.             (sw, sh) = self.Size
  432.             py = parent.Position.y
  433.             pph = grandparent.Size.height - 16
  434.             if parent.Position.y + parent.Size.height > grandparent.Size.height - 16 and sy + sh + py > pph:
  435.                 cliptangle = Rect(0, 0, sw, pph - sy + py)
  436.                 dc = wx.PaintDC(self)
  437.                 dc.SetClippingRect(cliptangle)
  438.             
  439.         else:
  440.             dc = BufferedPaintDC(self)
  441.         if self.isdown:
  442.             pass
  443.         elif self.state and self.notified:
  444.             pass
  445.         elif self.state:
  446.             pass
  447.         
  448.         currentstate = 0
  449.         if self.rendernative:
  450.             nrect = None if self.type == 'combo' else rect.Inflate(1, 1)
  451.             part = 1
  452.             state = self.backgrounds[currentstate]
  453.             self.DrawNativeLike(dc, part, state, nrect)
  454.         else:
  455.             background = self.backgrounds[currentstate]
  456.             SplitImage4 = SplitImage4
  457.             import cgui
  458.             if isinstance(background, SplitImage4):
  459.                 ApplySmokeAndMirrors(self, background.GetBitmap(self.Size))
  460.             else:
  461.                 ApplySmokeAndMirrors(self)
  462.             background.Draw(dc, rect)
  463.         if not self.type == 'combo' and self.rendernative:
  464.             self.DrawContent(dc)
  465.         
  466.  
  467.     
  468.     def OnShow(self, e):
  469.         if not e.GetShow() and self.menu and not wx.IsDestroyed(self.menu) and self.menu.IsShown():
  470.             self.menu.Hide()
  471.         
  472.  
  473.     
  474.     def DrawContent(self, dc):
  475.         if not not (self.menu):
  476.             if self.label != '' and self.icon or self.style == VERTICAL or self.label == '':
  477.                 if self.label != '' and self.icon:
  478.                     pass
  479.         offset = (None if not (self.style == HORIZONTAL) else 0, self.Size.height / 2 - self.ssize[1] / 2)
  480.         (ml, mt, mr, mb) = self.margins
  481.         if self.icon:
  482.             None(dc.DrawBitmap if self.IsEnabled() else self.dicon, self.iconcurser[0] + offset[0] + ml, self.iconcurser[1] + offset[1] + mt, True)
  483.         
  484.         if self.label != '':
  485.             dc.Font = self.Font
  486.             if self.state and self.notified:
  487.                 pass
  488.             elif self.isdown:
  489.                 pass
  490.             elif self.state:
  491.                 pass
  492.             
  493.             currentstate = 0
  494.             dc.TextForeground = self.fontcolors[currentstate]
  495.             dc.Font = self.Font
  496.             labelcurser = self.labelcurser
  497.             loffset = (max(offset[0], 0), max(offset[1], 0))
  498.             w = None(min, self.labelsize.x - self.Rect.Width - labelcurser.x - loffset[0] - self.padding[0] - mr if self.menu and not (self.menubarmode) else 0) + 2
  499.             lrect = Rect(labelcurser.x + loffset[0] + ml, labelcurser.y + loffset[1] + mt, w, self.labelsize[1])
  500.             dc.DrawLabel(TruncateText(self.label.replace('&', ''), w, None, dc), lrect, LEFT_VCENTER, indexAccel = self.label.find('&'))
  501.         
  502.         if self.type == 'menu' and not (self.menubarmode):
  503.             dc.DrawBitmapPoint(self.menuicon, wx.Point(self.Size.width - self.menuicon.Width - self.padding[0] - mr, (self.Size.height - mt + mb) / 2 + mt - self.menuicon.Height / 2), True)
  504.         
  505.  
  506.     
  507.     def Active(self, switch = None):
  508.         if self.state:
  509.             if switch == None:
  510.                 self.active = not (self.active)
  511.             else:
  512.                 self.active = switch
  513.             self.state = None if self.active else 1
  514.         
  515.         self.Refresh()
  516.  
  517.     
  518.     def IsActive(self):
  519.         return self.active
  520.  
  521.     
  522.     def OnKillFocus(self, event):
  523.         if self.native:
  524.             event.Skip()
  525.             self.Refresh()
  526.             return None
  527.         
  528.         if self.isdown:
  529.             self.OnMouseOut(event)
  530.         
  531.         self.Refresh()
  532.  
  533.     
  534.     def OnKeyDown(self, event):
  535.         if self.native:
  536.             event.Skip()
  537.             self.Refresh()
  538.             return None
  539.         
  540.         if event.KeyCode == wx.WXK_SPACE:
  541.             if not (self.isdown) and not wx.LeftDown():
  542.                 self.OnLeftDown(event)
  543.             
  544.         else:
  545.             event.Skip()
  546.             self.Refresh()
  547.  
  548.     
  549.     def OnKeyUp(self, event):
  550.         if self.native:
  551.             event.Skip()
  552.             self.Refresh()
  553.             return None
  554.         
  555.         if event.KeyCode == wx.WXK_SPACE:
  556.             if self.isdown and not wx.LeftDown():
  557.                 self.OnLeftUp(event)
  558.             
  559.         else:
  560.             event.Skip()
  561.  
  562.     
  563.     def OnLeftDown(self, event = None):
  564.         if self.native:
  565.             self.isdown = True
  566.             event.Skip()
  567.             self.Refresh()
  568.             return None
  569.         
  570.         if self.isdown:
  571.             self.OnMouseOut(event)
  572.             return None
  573.         
  574.         self.isdown = True
  575.         if not self.HasCapture():
  576.             self.CaptureMouse()
  577.         
  578.         self.SetFocus()
  579.         if self.type == 'menu':
  580.             if not self.active:
  581.                 self.CallMenu()
  582.             elif self.menu:
  583.                 self.Active(False)
  584.                 self.menu.Dismiss()
  585.             
  586.         
  587.         self.Refresh()
  588.  
  589.     
  590.     def SendButtonEvent(self, type = None):
  591.         if not type:
  592.             pass
  593.         eventType = wx.wxEVT_COMMAND_BUTTON_CLICKED
  594.         evt = wx.CommandEvent(eventType, self.Id)
  595.         evt.EventObject = self
  596.         self.AddPendingEvent(evt)
  597.  
  598.     
  599.     def OnLeftUp(self, event):
  600.         if self.native:
  601.             self.isdown = False
  602.             event.Skip()
  603.             self.Refresh()
  604.             return None
  605.         
  606.         while self.HasCapture():
  607.             self.ReleaseMouse()
  608.         if self.isdown:
  609.             self.isdown = False
  610.             if (event.m_x >= 0 and event.m_x <= self.Size.x and event.m_y >= 0 or event.m_y <= self.Size.y or hasattr(event, 'KeyCode')) and event.KeyCode == wx.WXK_SPACE:
  611.                 if self.type == 'toggle':
  612.                     self.Active()
  613.                     self.SendButtonEvent(wx.wxEVT_COMMAND_TOGGLEBUTTON_CLICKED)
  614.                 elif not self.type == 'menu':
  615.                     self.SendButtonEvent()
  616.                 
  617.             
  618.             self.Refresh()
  619.         
  620.  
  621.     
  622.     def GetHover(self):
  623.         self.hovered = True
  624.         self.Refresh()
  625.         event = UberEvents.UBOver(source = self)
  626.         self.Parent.AddPendingEvent(event)
  627.  
  628.     
  629.     def OnMouseIn(self, event):
  630.         if not event.LeftIsDown() or self.menubarmode:
  631.             self.GetHover()
  632.         
  633.         if self.native:
  634.             event.Skip()
  635.             return None
  636.         elif self.HasCapture():
  637.             self.isdown = True
  638.             self.Refresh()
  639.         
  640.  
  641.     
  642.     def OnMouseOut(self, event = None):
  643.         self.isdown = False
  644.         if self.native:
  645.             event.Skip()
  646.             return None
  647.         
  648.         if self.menubarmode:
  649.             while self.HasCapture():
  650.                 self.ReleaseMouse()
  651.         
  652.         self.ReleaseHover()
  653.         self.Refresh()
  654.  
  655.     
  656.     def ReleaseHover(self):
  657.         self.hovered = False
  658.         self.Refresh()
  659.         event = UberEvents.UBOut(source = self)
  660.         self.Parent.AddPendingEvent(event)
  661.  
  662.     
  663.     def CallMenu(self):
  664.         self.Active()
  665.         if self.active:
  666.             event = wx.MenuEvent(wx.wxEVT_MENU_OPEN, -1)
  667.             event.SetEventObject(self.menu)
  668.             self.Top.ProcessEvent(event)
  669.             while self.HasCapture():
  670.                 self.ReleaseMouse()
  671.             self.menu.Display(self)
  672.         
  673.  
  674.     
  675.     def GetValue(self):
  676.         return self.active
  677.  
  678.     
  679.     def SetValue(self, v):
  680.         self.active = v
  681.         self.Refresh()
  682.  
  683.     Value = property(GetValue, SetValue)
  684.     
  685.     def AcceptsFocusFromKeyboard(self):
  686.         return not (self.menubarmode)
  687.  
  688.     
  689.     def AcceptsFocus(self):
  690.         return not (self.menubarmode)
  691.  
  692.  
  693.